/*
题目描述

用链式存储实现栈的初始化、入栈、出栈、取栈顶、判栈空等操作,在主函数中借助栈的基本操作逆置单链表。


输入

线性表的长度：n
该线性表中的元素：a1

				  a2

				  ...

				  an
输出

逆置后的线性表为：an

				  ...

				  a2

				  a1
样例输入

10
安弥邵 10000001 女 28 计43 一般
宰觅 10000002 男 23 计79 健康
顾健 10000003 男 27 计29 一般
宓顽芳 10000004 女 20 计17 健康
能纸垄 10000005 男 18 计11 健康
米倍庐 10000006 女 18 计38 神经衰弱
养句电 10000007 女 19 计96 神经衰弱
牛议 10000008 男 18 计92 一般
堵侥 10000009 男 27 计35 健康
支脸蕉 10000010 男 21 计58 健康

样例输出

支脸蕉 10000010 男 21 计58 健康
堵侥 10000009 男 27 计35 健康
牛议 10000008 男 18 计92 一般
养句电 10000007 女 19 计96 神经衰弱
米倍庐 10000006 女 18 计38 神经衰弱
能纸垄 10000005 男 18 计11 健康
宓顽芳 10000004 女 20 计17 健康
顾健 10000003 男 27 计29 一般
宰觅 10000002 男 23 计79 健康
安弥邵 10000001 女 28 计43 一般

*/
#include <iostream>
#include <string>

using namespace std;

class StudentRecord
{
	string stuName;
	int stuNo;
	string stuGender;
	int stuAge;
	string stuClass;
	string stuHealth;
public:
	StudentRecord() {}
	StudentRecord(string stuName,
		int stuNo,
		string stuGender,
		int stuAge,
		string stuClass,
		string stuHealth);
	void print();
};

struct StudentNode
{
	StudentRecord data;
	StudentNode* next;
};

StudentNode* CreatNode(StudentRecord data)
{
	StudentNode* newnode = new StudentNode;
	if (newnode == NULL)
	{
		exit(-1);
	}
	newnode->data = data;
	return newnode;
}

void ListPushHead(StudentNode** pplist, StudentRecord data)
{
	StudentNode* newnode = CreatNode(data);
	if (!(*pplist))
	{
		*pplist = newnode;
	}
	else
	{
		newnode->next = *pplist;
		*pplist = newnode;
	}
}

void ListPopHead(StudentNode** pplist)
{
	StudentNode* head = *pplist;
	*pplist = head->next;
	delete head;
	head = NULL;
}

int main()
{
	StudentNode* pHead = NULL;
	string stuName, stuGender, stuClass, stuHealth;
	int stuNo, stuAge;
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> stuName >> stuNo >> stuGender 
			>> stuAge >> stuClass >> stuHealth;
		StudentRecord data(stuName,
			stuNo,
			stuGender,
			stuAge,
			stuClass,
			stuHealth);
		ListPushHead(&pHead, data);
	}
	for (int i = 0; i < n; i++) {
		pHead->data.print();
		ListPopHead(&pHead);
	}
	return 0;
}

StudentRecord::StudentRecord(string stuName, int stuNo, string stuGender, 
	int stuAge, string stuClass, string stuHealth) :
	stuName(stuName), stuNo(stuNo), stuGender(stuGender), 
	stuAge(stuAge), stuClass(stuClass), stuHealth(stuHealth)
{}

void StudentRecord::print()
{
	cout << stuName << " "
		<< stuNo << " "
		<< stuGender << " "
		<< stuAge << " "
		<< stuClass << " "
		<< stuHealth << endl;
}
